package tjs.study.notes.dotest.jvm.heap;

/**
 * Created by Nicky.Tang on 2021/10/14 10:46 上午
 *
 * @since 02.12.10
 */
public class TestFinalize {
    /**
     * *流程
     * 1.首次gc时，先调用finzlize，加入F-Queue的队列中异步执行
     * 如果一个对象没有gcroots且没有调用过finzlize方法才会加入队列
     * fixme 该队列优先级很低，并不会保证马上执行
     * 2.后续gc时，
     * 如果finzlize方法执行完毕，且当前对象没有"自救"则会被回收掉
     * 如果finzlize方法执行时间过久，则本次gc并不会等待他执行完，直到finzlize方法执行完，才会可能再次被尝试gc
     * <p>
     * *用途
     * 1.释放一些其他做法开辟的内存空间（垃圾回收器只知道那些显示地经由new分配的内存空间，比如native方法中构造的对象可能不能被jvm回收;打开的文件资源也不能）
     * 2.做一些清理工作（数据源，file流等）
     * 3.对象最后一次逃脱回收的机会（关联一个gc roots）
     */
    public static void main(String[] args) throws InterruptedException {
        UserJvm userJvm = new UserJvm(1, "我有引用指向GC ROOTS");
        new UserJvm(2, "我没有引用指向GC ROOTS");
        System.gc();
        Thread.currentThread().sleep(999999);
    }
}
